package com.bbva.gptf.back.servicio.simulacion;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.bbva.gptf.back.dominio.Tgpt025Instrumento;
import com.bbva.gptf.back.dominio.Vgpt003Plazo;
import com.bbva.gptf.back.transformador.TransformadorInstrumentoSimulacion;
import com.bbva.gptf.back.transformador.TransformadorPlazosSimulacion;
import com.bbva.gptf.dto.bean.InstrumentosSimulacion;
import com.bbva.gptf.dto.bean.PlazoSimulacion;
import com.bbva.gptf.dto.bean.TipoContrato;
import com.bbva.gptf.dto.servicio.simulacion.ServicioIntegracion;
import com.bbva.gptf.dto.servicio.simulacion.ServicioSimulacion;
import com.bbva.jee.arq.spring.core.httpService.HttpService;

@HttpService(serviceName = "servicioIntegracionHttp")
public class ServicioIntegracionImpl implements ServicioIntegracion {

	@Autowired
	TransformadorInstrumentoSimulacion transformadorInstrumentoSimulacion;

	@Autowired
	ServicioSimulacion servicioSimulacion;

	TransformadorPlazosSimulacion transformadorPlazosSimulacion = new TransformadorPlazosSimulacion();

	@Override
	public List<InstrumentosSimulacion> obtenerInstrumentos(final String tipoMercado,
			final String tipoValor, final String emisora, final String serie, final int plazoMin,
			final int plazoMax) {

		final List<Tgpt025Instrumento> entityInstumentos = Tgpt025Instrumento
				.obtieneInstrumentoPorTValorEmisoraYSerie(tipoMercado, tipoValor, emisora, serie,
						plazoMin, plazoMax);
		final List<InstrumentosSimulacion> instrumentos = new ArrayList<InstrumentosSimulacion>();

		if (entityInstumentos != null) {
			for (final Tgpt025Instrumento lista : entityInstumentos) {
				InstrumentosSimulacion instrumento = transformadorInstrumentoSimulacion
						.convert(lista);
				instrumentos.add(instrumento);
			}
		}
		return instrumentos;
	}

	@Override
	public List<InstrumentosSimulacion> calculaMontoImpacto(
			final List<InstrumentosSimulacion> posicion,
			final List<InstrumentosSimulacion> instrumentos, final String tipoOperacion) {
		LinkedHashMap<String, InstrumentosSimulacion> hmInstrumentos = new LinkedHashMap<String, InstrumentosSimulacion>();
//		for (InstrumentosSimulacion instrumento : instrumentos) {
//			instrumento.getInstrumentoObjetivo().setImpactoMontoFideicomisos(BigDecimal.ZERO);
//			instrumento.getInstrumentoObjetivo().setImpactoMontoPatrimonial(BigDecimal.ZERO);
//			instrumento.getInstrumentoObjetivo().setImpactoMontoTotal(BigDecimal.ZERO);
//			hmInstrumentos.put(instrumento.getId(), instrumento);
//		}

		BigDecimal impactoMonto = BigDecimal.ZERO;
		BigDecimal montoActual = BigDecimal.ZERO;
		BigDecimal pcIntegracionDia;
		BigDecimal pcIntegracionObj;
		BigDecimal pcDiferencia;
		for (final InstrumentosSimulacion instrumentoContrato : posicion) {
			String key = new String();
//			key = instrumentoContrato.getCdValorBmv() + '_' + instrumentoContrato.getEmisora()
//					+ '_' + instrumentoContrato.getSerie();
//			if(hmInstrumentos.containsKey(key) 
//					&& hmInstrumentos.get(key).getInstrumentoObjetivo().getPcIntegracionObjetivo().compareTo(BigDecimal.ZERO) > 0){
//				pcIntegracionDia = instrumentoContrato.getInstrumentoActual().getPcIntegracion() != null ? instrumentoContrato
//						.getInstrumentoActual().getPcIntegracion()
//						.setScale(4, BigDecimal.ROUND_HALF_UP)
//						: BigDecimal.ZERO;
//				pcIntegracionObj = hmInstrumentos.get(key).getInstrumentoObjetivo()
//						.getPcIntegracionObjetivo() != null ? hmInstrumentos.get(key)
//						.getInstrumentoObjetivo().getPcIntegracionObjetivo()
//						.divide(new BigDecimal(100)).setScale(4, BigDecimal.ROUND_HALF_UP)
//						: BigDecimal.ZERO;
//				pcDiferencia = pcIntegracionDia.subtract(pcIntegracionObj);
//				if (tipoOperacion.equals("C") && pcDiferencia.signum() == -1
//						|| tipoOperacion.equals("V") && pcDiferencia.signum() == 1
//						|| tipoOperacion.equals("CV")) {
//					impactoMonto = instrumentoContrato.getInstrumentoObjetivo()
//							.getInstrumentoActual().getValuacionCartera().multiply(pcDiferencia)
//							.negate().setScale(2, BigDecimal.ROUND_HALF_UP);
//				}
//
//				if (instrumentoContrato.getTipoContrato().equals(TipoContrato.FIDEICOMISOS)) {
//					montoActual = hmInstrumentos.get(key).getInstrumentoObjetivo()
//							.getImpactoMontoFideicomisos();
//					hmInstrumentos.get(key).getInstrumentoObjetivo()
//							.setImpactoMontoFideicomisos(montoActual.add(impactoMonto));
//				}
//				else if (instrumentoContrato.getTipoContrato().equals(TipoContrato.PATRIMONIAL)) {
//					montoActual = hmInstrumentos.get(key).getInstrumentoObjetivo()
//							.getImpactoMontoPatrimonial();
//					hmInstrumentos.get(key).getInstrumentoObjetivo()
//							.setImpactoMontoPatrimonial(montoActual.add(impactoMonto));
//				}
//				montoActual = hmInstrumentos.get(key).getInstrumentoObjetivo()
//						.getImpactoMontoTotal();
//				hmInstrumentos.get(key).getInstrumentoObjetivo()
//						.setImpactoMontoTotal(montoActual.add(impactoMonto));
				impactoMonto = new BigDecimal(0);
				montoActual = new BigDecimal(0);
//			}
		}

		return new ArrayList<InstrumentosSimulacion>(hmInstrumentos.values());
	}

	@Override
	public List<InstrumentosSimulacion> integracionObjetivo(List<InstrumentosSimulacion> listaInstrumentos) {
		List<InstrumentosSimulacion> instrumentosObjetivo = new ArrayList<InstrumentosSimulacion>();
		
		/* Elimina los instrumentos con porcentaje objetivo igual a cero */
//		for (InstrumentosSimulacion instrumento : listaInstrumentos) {
//			if (!instrumento.getInstrumentoObjetivo().getPcIntegracionObjetivo().equals(new BigDecimal(0))) {
//				System.out.println("integracionObjetivo getPrecioCapturado: "+instrumento.getInstrumentoObjetivo().getPrecioCapturado());
//				if(instrumento.getInstrumentoObjetivo().getPrecioCapturado() != null){
//					instrumento.getInstrumentoObjetivo().setPrecio(instrumento.getInstrumentoObjetivo().getPrecioCapturado());
//				}
//				instrumentosObjetivo.add(instrumento);
//			}
//			
//		}
		return instrumentosObjetivo;
	}

	public void setTransformadorInstrumentoSimulacion(
			final TransformadorInstrumentoSimulacion transformadorInstrumentoSimulacion) {
		this.transformadorInstrumentoSimulacion = transformadorInstrumentoSimulacion;
	}

	public void setServicioSimulacion(final ServicioSimulacion servicioSimulacion) {
		this.servicioSimulacion = servicioSimulacion;
	}

	@Override
	public List<PlazoSimulacion> obtienePlazos(final String tipoValor, final String emisora) {
		final List<Vgpt003Plazo> entityPlazos = Vgpt003Plazo.findByTipoValorYEmisora(tipoValor,
				emisora);
		final List<PlazoSimulacion> listaPlazos = new ArrayList<PlazoSimulacion>();

		if (entityPlazos != null) {
			for (final Vgpt003Plazo ePlazo : entityPlazos) {
				PlazoSimulacion plazo = transformadorPlazosSimulacion.convert(ePlazo);
				listaPlazos.add(plazo);
			}
		}
		return listaPlazos;
	}

}
